package semac.control;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import semac.entidades.Documento;

/**
 *
 * @author Ivan Ricardo Flores
 */
public class CtrlDocumentos {

    private ArrayList<Documento> documentos;
    private HttpServletRequest request;
    private Conexion connection;
    private String query;
    private ResultSet resultado;

    public CtrlDocumentos() throws IOException, ParserConfigurationException, SAXException {
        documentos = new ArrayList();

        request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        String urlFile = request.getRealPath("/") + "/WEB-INF/dataBase.xml";
        connection = new Conexion(urlFile);
    }

    //Solicita al manejador de documentos entregados del alumno
    public ArrayList<Documento> getDocumentosEntregados(int codigoAlumno) throws ClassNotFoundException, SQLException {
        documentos.clear();
        Documento doc = new Documento();
        query = "SELECT semac.documento.codigo_documento,semac.documento.nombre_documento," 
                + "semac.documento.descripcion_documento,semac.documento.fechacreacion,"
                + "semac.documento.fechamodificacion,semac.documento.codigo_cuenta"
                + "FROM semac.documentoalumno, semac.documento"
                + "WHERE semac.documentoalumno.codigo_alumno = " + codigoAlumno
                + "AND semac.documentoalumno.estadoentrega_documentoalumno='1'"
                + "AND semac.documentoalumno.codigo_documento=semac.documento.codigo_documento";

        connection.startConnection();
        resultado = connection.execute(query);

        while (resultado.next()) {
            doc.setCodigo(resultado.getInt("codigo_documento"));
            doc.setNombre(resultado.getString("nombre_documento"));
            doc.setDescripcion(resultado.getString("descripcion_documento"));

            Date tempDate = resultado.getDate("fechacreacion");
            GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaCreacion(fechaCreacion);

            tempDate = resultado.getDate("fechamodificacion");
            GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaModificacion(fechaModificacion);
            doc.setUltimoAcceso(resultado.getInt("codigo_cuenta"));

            documentos.add(doc);
        }
        connection.closeConnection();
        
        return documentos;
    }

    //Solicita al manejador de documentos los alumnos
    public ArrayList<Documento> getDocumentosPendientes(int codigoAlumno) throws ClassNotFoundException, SQLException {
        documentos.clear();
        Documento doc = new Documento();
        query = "SELECT semac.documento.codigo_documento,semac.documento.nombre_documento,"
                + "semac.documento.descripcion_documento,semac.documento.fechacreacion,"
                + "semac.documento.fechamodificacion,semac.documento.codigo_cuenta"
                + "FROM semac.documentoalumno, semac.documento"
                + "WHERE semac.documentoalumno.codigo_alumno = " + codigoAlumno
                + "AND semac.documentoalumno.estadoentrega_documentoalumno='0'"
                + "AND semac.documentoalumno.codigo_documento=semac.documento.codigo_documento";

        connection.startConnection();
        resultado = connection.execute(query);

        while (resultado.next()) {
            doc.setNombre(resultado.getString("nombre_documento"));
            doc.setDescripcion(resultado.getString("descripcion_documento"));

            Date tempDate = resultado.getDate("fechacreacion");
            GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaCreacion(fechaCreacion);

            tempDate = resultado.getDate("fechamodificacion");
            GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaModificacion(fechaModificacion);
            doc.setUltimoAcceso(resultado.getInt("codigo_cuenta"));

            documentos.add(doc);
        }
        connection.closeConnection();

        return documentos;
    }

    //Metodo que crea una relacion por cada documento con el alumno especificado
    public void setDocumentosAlumno(int codigoAlumno, int cuenta) throws ClassNotFoundException, SQLException{
        documentos.clear();
        documentos=getDocumentos();
        GregorianCalendar fecha = new GregorianCalendar();
        connection.startConnection();
        for(int i = 0; i < documentos.size(); i++){
            query = "INSERT INTO semac.documentoalumno VALUES" +
                    "("+documentos.get(i).getCodigo()+","
                    + codigoAlumno +"," 
                    +"'0'"
                    + "'"+ fecha.getTime().getDate() + "/"
                    + (fecha.getTime().getMonth() + 1) + "/"
                    + (fecha.getTime().getYear() + 1900) + "', '"
                    + fecha.getTime().getDate() + "/"
                    + (fecha.getTime().getMonth() + 1)+ "/"
                    + (fecha.getTime().getYear() + 1900) + "', "
                    + cuenta+")";
            resultado = connection.execute(query);
            
        }
        connection.closeConnection();

    }

    //Obtiene todos los documentos alamcenados en la base de datos
    public ArrayList<Documento> getDocumentos() throws ClassNotFoundException, SQLException{
        documentos.clear();
        Documento doc=new Documento();
        query = "SELECT * FROM semac.documento";

        connection.startConnection();
        resultado = connection.execute(query);

        while (resultado.next()) {
            doc.setCodigo(resultado.getInt("codigo_documento"));
            doc.setNombre(resultado.getString("nombre_documento"));
            doc.setDescripcion(resultado.getString("descripcion_documento"));

            Date tempDate = resultado.getDate("fechacreacion");
            GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaCreacion(fechaCreacion);

            tempDate = resultado.getDate("fechamodificacion");
            GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
            doc.setFechaModificacion(fechaModificacion);
            doc.setUltimoAcceso(resultado.getInt("codigo_cuenta"));

            documentos.add(doc);
        }
        connection.closeConnection();
        return documentos;
    }

    //Método que modifica el estado de un documento, y lo relaciona con un alumno
    public void updateEstado(int codigoAlumno, int codigoDocumento, boolean estado) throws ClassNotFoundException, SQLException {
        query = "UPDATE semac.documentoalumno"
                + "SET semac.documentoalumno.estado_entrega = "+estado
                + "WHERE semac.documentoalumno.codigo_alumno = " + codigoAlumno
                + "AND semac.documentoalumno.codigo_documento = " + codigoDocumento;
        connection.startConnection();
        resultado = connection.execute(query);
        connection.closeConnection();
    }

    //Establece el estado de todos los documentos como “Pendiente=>False”
    public void restablecerEstados(int codigoAlumno, int codigoDocumento) throws ClassNotFoundException, SQLException {
        query = "UPDATE semac.documentoalumno"
                + "SET semac.documentoalumno.estado_entrega = '0'"
                + "WHERE semac.documentoalumno.codigo_alumno = " + codigoAlumno
                + "AND semac.documentoalumno.codigo_documento = " + codigoDocumento;
        connection.startConnection();
        resultado = connection.execute(query);
        connection.closeConnection();
    }
}
